{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这个实例中，我们使用tensorflow来实现一个简单的手写数字识别的网络，并用这个网络来做个\n",
    "简单的识别示例。\n",
    "\n",
    "首先导入一些用到的库。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:50.515650Z",
     "start_time": "2018-06-01T06:32:43.133728Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T05:39:48.304594Z",
     "start_time": "2018-06-01T04:55:17.674707Z"
    }
   },
   "source": [
    "先来看看数据长什么样子"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.075054Z",
     "start_time": "2018-06-01T06:32:50.518290Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "(55000, 784)\n",
      "(55000, 10)\n",
      "(5000, 784)\n",
      "(5000, 10)\n",
      "(10000, 784)\n",
      "(10000, 10)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"./\", one_hot=True)\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T05:49:40.128071Z",
     "start_time": "2018-06-01T05:49:40.123888Z"
    }
   },
   "source": [
    "可以看到images里面有数量不等的图片，每张图片是28x28长度的一个一维向量，\n",
    "所以用的时候需要先给它还原成28x28的二维图片。labels中则是图片对应的数字的值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.695746Z",
     "start_time": "2018-06-01T06:32:51.077167Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n1tfEdYdWctolT/w14vNvvMEukek58DsT313nN6ddjjv95Phhc/NA6c/IDcux1YOjnQfONnGHN+08\nfLM7Jjvtktu0NPH8f6Q7dbNPfcHEwSUzt9Zc7L7Yxzb8qmtTpypn46aIfYRIk76rTTzwc7sub/bm\nQ5x2NQMr/XIWLpFIMmRzxLpjXvibiReeY+eHO95+s9OuwcOl7/s63AkDAOAJSRgAAE/KzXB0UiU7\n/Dh/SHsTLz7HHfZ6Zqsdwnrv/jNN3PzdsKGuDDu8OLN5R6dOn2PXRqTstksoUr6eXthuIwr/O/H5\nQMn9XDnwD7vkod75c2N6/jov2mv/zQa7Zdbdw3/Lr3m+Fnxuf68aMBwtIiIqxf3zU6FLdMO7h/3P\nDjG2DBuCDsqZt8i26+3WndjPjoE+ducIE3etlOW0Cw5Pf51+uPskDEcXKGfLFhPPGGmndGoscZcJ\n5SyMPBUUreRd+d9PtuuxwClve7jIL1XsuBMGAMATkjAAAJ6QhAEA8CRh54STqrjb1K1+s7GJF3e2\nyxOe2tLSaTfh5pNNnPbtzxGfP/hV+ipbtjt1gyZPNPGodfar+du+PkCnEZPDK9htJsO3xJu60C4r\nyZCiz+Glz7bzuT/sdZc51Z6THd7c0CpiVbmV3KiBU5565Fv5tntmazOn3PoFO9eYE944SnVG2Lnk\nsX2PMnHXepHnmBG72qP8/Lv2rPO7U35DGkRo6Q93wgAAeEISBgDAk4Qajg4OQc9/8jCnLjgE/cTm\nVib+rldbp13yssJ/XX7lte6QdrfKE0y8+SD7fK/WaO+0y9m6rdCvhb86ZfaFJv7ysHedujFdR5n4\nIXGXkkUru5vdVe2gB+w0RLMU9/rVuX2ZiXd95D6Hyv/c8nJt+aX1Itbt1HYZy9sPn+nUVZ8beZoo\nFkuvbWLiH8e7p6V1qRgy8aJ+bn+b3Wt3hNLZkaciUPwyz+rslK/tPjHfdh9u6BT2k9K3PJA7YQAA\nPCEJAwDgSUINR/95ZQcTL+71rFP3yW67yf9357Yzcfay5UV+3X3VI481zttrh7AYfo6PtEH21/j5\n992pgX7VF5p44XNHm7jtf9c67dafbr81ec5Nk5y63jXsoR71UoKnNLgnNrzabLyJe/ZwN47Prsx4\ntIhIcu1aJr7zmncjtnt/h/1We/U3inf4OVzOHLur0jUT+jl1i3vZaax5vd2/KWd/ENiGa9rs+HSu\n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\n4hLFAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2a97b27f898>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4, 4, idx + 1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(np.argmax(mnist.train.labels[idx])))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28, 28)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来，定义用于训练的网络，首先定义网络的输入。\n",
    "\n",
    "这里我们直接使用上面的数据作为输入，所以定义两个placeholder分别用于图像和lable数据，另外，定义一个bool类型的变量用于标识当前网络是否正在训练。\n",
    "\n",
    "为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，两个placeholder的第一个维度就是batchsize，因为我们这里还没有确定batchsize，所以第一个维度留空。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.706044Z",
     "start_time": "2018-06-01T06:32:51.698913Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x = tf.placeholder(\"float\", [None, 784], name='x')\n",
    "y = tf.placeholder(\"float\", [None, 10], name='y')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "因为我们输入的是图片展开后的一维向量，所以第一步就需要先把一维向量还原为二维的图片。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.719298Z",
     "start_time": "2018-06-01T06:32:51.707730Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x_image = tf.reshape(x, [-1, 28, 28, 1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:07:36.530623Z",
     "start_time": "2018-06-01T06:07:36.522665Z"
    }
   },
   "source": [
    "接下来，我们定义第一个卷积层，使用6个5X5的卷积核对输入数据进行卷积，\n",
    "padding方式选择valid，所以输出数据的宽高变为24x24,但是深度已经从原来的1变成了6。\n",
    "本层卷积的激活函数为relu。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.764292Z",
     "start_time": "2018-06-01T06:32:51.721295Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('conv1'):\n",
    "    C1 = tf.contrib.slim.conv2d(\n",
    "        x_image, 6, [5, 5], padding='VALID', activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来进行stride为2的最大池化，池化后，输出深度不变，但是长宽减半，所以输出变成了12x12,深度6."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.774112Z",
     "start_time": "2018-06-01T06:32:51.766784Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('pool1'):\n",
    "    S2 = tf.contrib.slim.max_pool2d(C1, [2, 2], stride=[2, 2], padding='VALID')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:10:16.678485Z",
     "start_time": "2018-06-01T06:10:16.671472Z"
    }
   },
   "source": [
    "接下来，我们定义第二个卷积层，使用16个5X5的卷积核对输入数据进行卷积，\n",
    "padding方式还是选择valid，输出8x8,深度为16，本层卷积的激活函数为relu。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.805912Z",
     "start_time": "2018-06-01T06:32:51.776959Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('conv2'):\n",
    "    C3 = tf.contrib.slim.conv2d(\n",
    "        S2, 16, [5, 5], padding='VALID', activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "再进行一次stride为2的最大池化，输出为4x4,深度16。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.814748Z",
     "start_time": "2018-06-01T06:32:51.807560Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('pool2'):\n",
    "    S4 = tf.contrib.slim.max_pool2d(C3, [2, 2], stride=[2, 2], padding='VALID')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "池化后的数据是3维的，这里做一个拉平的操作，将3维数据展开到1维，然后送入两层全连接，全连接隐层中神经元个数分别为120，84。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.856740Z",
     "start_time": "2018-06-01T06:32:51.817287Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('fc1'):\n",
    "    S4_flat = tf.contrib.slim.flatten(S4)\n",
    "    C5 = tf.contrib.slim.fully_connected(\n",
    "        S4_flat, 120, activation_fn=tf.nn.relu)\n",
    "\n",
    "with tf.name_scope('fc2'):\n",
    "    F6 = tf.contrib.slim.fully_connected(C5, 84, activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:17:39.880958Z",
     "start_time": "2018-06-01T06:17:39.869797Z"
    }
   },
   "source": [
    "###### 对特征添加一个0.6的dropout，以40%的概率丢弃特征中的某些数据，\n",
    "这样可以提高网络的推广能力，减少过拟合的可能性。\n",
    "\n",
    "需要注意的是，dropout仅在训练的时候使用，验证的时候，需要关闭dropout，\n",
    "所以验证时候的keep_prob是1.0。\n",
    "\n",
    "dropout的输出最终送入一个隐层为10的全连接层，这个全连接层即为最后的分类器。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.913419Z",
     "start_time": "2018-06-01T06:32:51.860766Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('dropout'):\n",
    "    keep_prob = tf.placeholder(name='keep_prob', dtype=tf.float32)\n",
    "    F6_drop = tf.nn.dropout(F6, keep_prob)\n",
    "\n",
    "with tf.name_scope('fc3'):\n",
    "    logits = tf.contrib.slim.fully_connected(F6_drop, 10, activation_fn=None)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来定义loss和用于优化网络的优化器。loss计算使用了sparse_softmax_cross_entropy_with_logits,\n",
    "这样做的好处是labels可以不用手动做one_hot省了一些麻烦。这里使用了sgd优化器，学习率为0.3。\n",
    "\n",
    ">试试看，增大减小学习率，换个优化器再进行训练会发生什么。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:52.084738Z",
     "start_time": "2018-06-01T06:32:51.915376Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Conv/weights:0\n",
      "INFO:tensorflow:Summary name Conv/weights:0 is illegal; using Conv/weights_0 instead.\n",
      "Conv/biases:0\n",
      "INFO:tensorflow:Summary name Conv/biases:0 is illegal; using Conv/biases_0 instead.\n",
      "Conv_1/weights:0\n",
      "INFO:tensorflow:Summary name Conv_1/weights:0 is illegal; using Conv_1/weights_0 instead.\n",
      "Conv_1/biases:0\n",
      "INFO:tensorflow:Summary name Conv_1/biases:0 is illegal; using Conv_1/biases_0 instead.\n",
      "fully_connected/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected/weights:0 is illegal; using fully_connected/weights_0 instead.\n",
      "fully_connected/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected/biases:0 is illegal; using fully_connected/biases_0 instead.\n",
      "fully_connected_1/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected_1/weights:0 is illegal; using fully_connected_1/weights_0 instead.\n",
      "fully_connected_1/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected_1/biases:0 is illegal; using fully_connected_1/biases_0 instead.\n",
      "fully_connected_2/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected_2/weights:0 is illegal; using fully_connected_2/weights_0 instead.\n",
      "fully_connected_2/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected_2/biases:0 is illegal; using fully_connected_2/biases_0 instead.\n"
     ]
    }
   ],
   "source": [
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y))\n",
    "\n",
    "l2_loss = tf.add_n([\n",
    "    tf.nn.l2_loss(w)\n",
    "    for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)\n",
    "])\n",
    "\n",
    "for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES):\n",
    "    print(w.name)\n",
    "    tf.summary.histogram(w.name, w)\n",
    "    \n",
    "total_loss = cross_entropy_loss + 7e-5 * l2_loss\n",
    "tf.summary.scalar('cross_entropy_loss', cross_entropy_loss)\n",
    "tf.summary.scalar('l2_loss', l2_loss)\n",
    "tf.summary.scalar('total_loss', total_loss)\n",
    "\n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=0.3).minimize(total_loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:25:56.449132Z",
     "start_time": "2018-06-01T06:25:56.438340Z"
    }
   },
   "source": [
    "需要注意的是，上面的网络，最后输出的是未经softmax的原始logits，而不是概率分布，\n",
    "要想看到概率分布，还需要做一下softmax。\n",
    "\n",
    "将输出的结果与正确结果进行对比，即可得到我们的网络输出结果的准确率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:39:50.010829Z",
     "start_time": "2018-06-01T06:39:49.997501Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "pred = tf.nn.softmax(logits)\n",
    "correct_pred = tf.equal(tf.argmax(y, 1), tf.argmax(logits, 1))\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "saver用于保存或恢复训练的模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:52.127795Z",
     "start_time": "2018-06-01T06:32:52.103115Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "batch_size = 100\n",
    "trainig_step = 1100\n",
    "\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以上定义的所有操作，均为计算图，也就是仅仅是定义了网络的结构，实际需要运行的话，还需要创建一个session，并将数据填入网络中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:35:22.270272Z",
     "start_time": "2018-06-01T06:33:18.829198Z"
    },
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.198111, the validation accuracy is 0.9218\n",
      "after 200 training steps, the loss is 0.157624, the validation accuracy is 0.9632\n",
      "after 300 training steps, the loss is 0.172337, the validation accuracy is 0.9696\n",
      "after 400 training steps, the loss is 0.094089, the validation accuracy is 0.9728\n",
      "after 500 training steps, the loss is 0.0825461, the validation accuracy is 0.9784\n",
      "after 600 training steps, the loss is 0.154086, the validation accuracy is 0.9808\n",
      "after 700 training steps, the loss is 0.142005, the validation accuracy is 0.98\n",
      "after 800 training steps, the loss is 0.131109, the validation accuracy is 0.983\n",
      "after 900 training steps, the loss is 0.176984, the validation accuracy is 0.9786\n",
      "after 1000 training steps, the loss is 0.0813487, the validation accuracy is 0.9834\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9806\n"
     ]
    }
   ],
   "source": [
    "merged = tf.summary.merge_all()\n",
    "with tf.Session() as sess:\n",
    "\n",
    "    writer = tf.summary.FileWriter(\"logs/\", sess.graph)\n",
    "\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "        keep_prob: 1.0\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels, keep_prob: 1.0}\n",
    "\n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss, rs = sess.run(\n",
    "            [optimizer, cross_entropy_loss, merged],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                keep_prob: 0.6\n",
    "            })\n",
    "        writer.add_summary(rs, i)\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:58:16.766415Z",
     "start_time": "2018-06-01T06:58:15.918700Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-1000\n",
      "1.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16],\n",
    "                keep_prob: 1.0\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(\n",
    "                np.argmax(mnist.test.labels[idx]), order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# 卷积的特性描述：\n",
    "## 卷积层是卷积神经网络中的主要结构。卷积层具有很多重要的特性，包括：\n",
    "### 1.局部连接：卷积层具有局部连接的特性。图像的局部（感受野）与卷积核做卷积，抽取感受野范围内的图像特征；\n",
    "### 2.权值共享：对于一个卷积核来说，虽然其按照步长在整张图片上滑动，但是，在每一步做卷积时其参数，也就是权重是一样的，即每个卷积核的权重在整个图像范围内是共享的，这样能大大减少网络中的参数；\n",
    "### 3.多个滤波器：每层卷积层中，卷积核，也就是滤波器不止一个，可以有很多，这样，经过学习以后，每个卷积核能够学习到图像中的多种特征，这样便可以提高图像识别的性能；\n",
    "### 等等"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 卷积网络效果比全连接网络好的原因：\n",
    "## 卷积神经网络比全连接神经网络增加了卷积层和池化层。效果比全连接神经网络好的原因，\n",
    "## 从识别准确率上看：\n",
    "### 1.卷积层通过对图像的局部做卷积，获得了图像局部像素之间的位置关系，而全连接网络直接将图像拉成一维张量，实际上舍弃了像素之间位置关系的信息。卷积层获得的信息比全连接网络多，所以理论上，卷积神经网络的识别准确率肯定优于全连接神经网络；\n",
    "### 2.卷积神经网络具有池化层。池化层一个方面具有缩小网络规模，降低神经元的维度的维度的目的，但是更重要的是，池化实际上通过缩放图像，降低了图像因微小位移，缩放，旋转等造成的差异，换句话说，忽略了同一类的微小差异，提高了识别不同类图像的鲁棒性；\n",
    "## 从运算效果上看：\n",
    "### 1.卷积层因权值共享的原因，大大减少了参数的数量，减小了网络的规模，加快了网络的运算速度；\n",
    "### 2.池化层的加入，进一步减少了参数，降低了维度，也进一步加快了运算速度；\n",
    "### 等等\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.4"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
